package com.holly.unit.query.api;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;

import java.util.Map;

/**
 * 接口描述: 查询相关操作API接口
 *
 * @author fxr
 * @version 1.0.0
 * @date 2022/4/6 14:10
 */
public interface QueryApi {

    /**
     * 获取查询条件构造器QueryWrapper实例 通用查询条件已被封装完成
     * @param searchObj 查询实体
     * @param parameterMap request.getParameterMap()
     * @return QueryWrapper实例
     */
    <T> QueryWrapper<T> initQueryWrapper(T searchObj, Map<String, String[]> parameterMap);

    /**
     * 组装Mybatis Plus 查询条件
     * <p>使用此方法 需要有如下几点注意:
     * <br>1.使用QueryWrapper 而非LambdaQueryWrapper;
     * <br>2.实例化QueryWrapper时不可将实体传入参数
     * <br>错误示例:如QueryWrapper<HollyDemo> queryWrapper = new QueryWrapper<HollyDemo>(HollyDemo);
     * <br>正确示例:QueryWrapper<HollyDemo> queryWrapper = new QueryWrapper<HollyDemo>();
     * <br>3.也可以不使用这个方法直接调用 {@link #initQueryWrapper}直接获取实例
     */
    void installMplus(QueryWrapper<?> queryWrapper,Object searchObj,Map<String, String[]> parameterMap);

    /***
     * 多字段排序
     * @param queryWrapper
     * @param parameterMap
     */
    void doMultiFieldsOrder(QueryWrapper<?> queryWrapper,Map<String, String[]> parameterMap);

    /***
     * 高级查询
     * @param queryWrapper
     * @param parameterMap
     */
    void doSuperQuery(QueryWrapper<?> queryWrapper,Map<String, String[]> parameterMap);

    /***
     * 获取查询条件
     * @param field
     * @param alias
     * @param value
     * @param isString
     * @return
     */
    String getSingleQueryConditionSql(String field,String alias,Object value,boolean isString);

    /***
     * 根据权限相关配置生成相关的SQL 语句
     * @param clazz
     * @return
     */
    String installAuthJdbc(Class<?> clazz);

    /***
     * 根据权限相关配置 组装mp需要的权限
     * @param queryWrapper
     * @param clazz
     */
    void installAuthMplus(QueryWrapper<?> queryWrapper,Class<?> clazz);


    /***
     * 转换sql中的系统变量
     * @param sql
     * @return
     */
    String convertSystemVariables(String sql);

    /***
     * 获取所有配置的权限 返回sql字符串 不受字段限制 配置什么就拿到什么
     * @return
     */
    String getAllConfigAuth();


    /***
     * 根据sqlRule 获取sql中的值
     * @param sqlRule
     * @return
     */
    String getSqlRuleValue(String sqlRule);






}
